<?php 
/**
 * 无框架的框架 basket
 * 特点如下
 * 1. 可以把basket比喻为一间小房间，blib/目录里的各个文件比喻为家电家具，当你需要搬家(换其他框架)时，只需要搬动家具(/blib目录的文件)即可
 * 2. 简单实用，按需加载 通过basket('xxx')就能调用需要的文件
 * 3. 让编程回归原始，让代码物尽其用
 *
 * @package    Basket
 * @category   framework
 * @author     phpseyo 
 */
define('BASKET_DIR', dirname(__FILE__).'/');
/**
 * 加载所需类的函数
 * @param string $class 可以为 aa/bb 格式
 */
function load($class)
{
	$user_file = BASKET_DIR . '../blib/' . $class . '.php';
	$sys_file = BASKET_DIR . 'blib/' . $class . '.php';
	
	if (is_file($user_file)) {
		return require($user_file);
	} elseif (is_file($sys_file)) {
		return require($sys_file);
	} else {
		exit("no {$sys_file}");
	}
}

// spl_autoload_register('load');

/**
 * 一个篮子，自动引用 /basket/blib 或 /blib 目录里的 $lib.php 文件，这个文件的内容可以是个名为 $lib 的类，或者是个函数库，或者是个 return array
 * @param string $lib
 * @return Ambigous <unknown>
 */
function basket($lib, $param = array())
{
	// 静态数组，保证$lib只被包含一次
	static $lib_arr = array();
	if (! isset($lib_arr[$lib])) {
		$var = load($lib);
		$class = strstr($lib, '/') ? substr($lib, strrpos($lib, '/')+1) : $lib;
		if (isset($param['class'])) {
			// $param数组中包含有 class 的键值，则 new 一个
			$lib_arr[$lib] = new $param['class']();
		} elseif(is_array($var)) {
			// $lib 对应文件是个 return array 的文件
			$lib_arr[$lib] = $var;
		} elseif (class_exists($class)) {
			// 比如 $lib 是 aa/bb,那么 bb.php中包含有类名为 bb 的，则 new 一个
			$lib_arr[$lib] = new $class();
		} else {
			// $lib 对应是个函数库文件，
			$lib_arr[$lib] = 1;
		}
		
	}
	return $lib_arr[$lib];
}